import { ObjectQueueInstance } from "./type"
// 对象队列类
export class ObjectQueue<T> {
    protected tail: number = 0;
    protected queue: ObjectQueueInstance<T>;
    protected headIndex: number = 0;
    // 构造函数
    constructor() {
        this.queue = {};
    }
    // 迭代器接口
    *[Symbol.iterator]() {
        let i = this.headIndex;
        while (i < this.tail) {
            yield this.queue[i];
            i++;
        }
    }
    // 入队方法
    enqueue(item: T): void {
        this.queue[this.tail] = item;
        this.tail++;
    }
    // 判断队列是否为空方法
    isEmpty(): boolean {
        return this.length() === 0;
    }
    // 出队方法
    dequeue(): T | undefined {
        if (this.isEmpty()) {
            return undefined;
        }
        const res = this.queue[this.headIndex];
        delete this.queue[this.headIndex];
        this.headIndex++;// 头指针前移
        return res;
    }
    // 获取队首元素
    peek(): T | undefined {
        if (this.isEmpty()) {
            return undefined;
        }
        return this.queue[this.headIndex];
    }
    // 获取队列长度
    length(): number {
        return this.tail - this.headIndex;
    }
    // 清空队列
    clear() {
        this.queue = {};
        this.headIndex = 0;
        this.tail = 0;
    }
    // 串行字符串化
    stringfy(): string {
        let res = '';
        for (let i = this.headIndex; i < this.tail; i++) {
            res = res + this.queue[i] + ','
        }
        return res.slice(0, -1);
    }
}

// 测试用例
const queue = new ObjectQueue<string>();
console.log(queue.dequeue(), queue.isEmpty(), queue.peek());
// 入队
queue.enqueue("队列中的第一条数据");
// 迭代器测试
for (let val of queue) {
    console.log('迭代器测试：', val);
}
queue.enqueue("队列中的第二条数据");
queue.enqueue("队列中的第三条数据");

// 迭代器测试
for (let val of queue) {
    console.log('迭代器测试：', val);
}

// 检查边缘情况
console.log(queue.peek(), queue.isEmpty());
// 出队
queue.dequeue();

// 获取队首元素
console.log(queue.peek());

// 获取队列大小
console.log(queue.length());

// 获取队列中的所有元素
console.log(queue.stringfy());

// 判断队列中是否有数据
console.log(queue.isEmpty());

// 清空队列
queue.clear();

// 迭代器测试
for (let val of queue) {
    console.log('迭代器测试：', val);
}

console.dir(queue);
